package com.mjf.scala.chapter07

/**
 * 简单版本 WordCount
 */
object Scala15_TestWordCount {
  def main(args: Array[String]): Unit = {

    // 单词计数：将集合中出现的相同的单词，进行计数，取计数排名前三的结果
    val stringList = List("Hello Scala Hbase kafka", "Hello Scala Hbase", "Hello Scala", "Hello")

    // 对集合中字符串进行切割，切割之后形成一个字符串数组，对其进行扁平化处理
    val wordList: List[String] = stringList.flatMap(_.split(" "))
    println(wordList)

    // 将相同的单词放到一组中
    val groupMap: Map[String, List[String]] = wordList.groupBy(elem => elem)
    println(groupMap) // Map(Hello -> List(Hello, Hello, Hello, Hello), Hbase -> List(Hbase, Hbase))

    // 对分组后的map集合中的内容进行结构转换 Map(hello -> 4, Hbase -> 2)
    // 注意：map里面的函数参数是一个元素，不要误认为是两个参数
    val countMap: Map[String, Int] = groupMap.map(kv => {
      (kv._1, kv._2.size)
    })
    println(countMap) // Map(Hello -> 4, Hbase -> 2, kafka -> 1, Scala -> 3)

    // 排序取前三
    println(countMap.toList) // List((Hello,4), (Hbase,2), (kafka,1), (Scala,3))
//    val sortList: List[(String, Int)] = countMap.toList.sortBy(_._2).reverse
    val sortList: List[(String, Int)] = countMap.toList.sortWith(_._2 > _._2)
    println(sortList)   // List((Hello,4), (Scala,3), (Hbase,2), (kafka,1))
    val res: List[(String, Int)] = sortList.take(3)
    println(res)  // List((Hello,4), (Scala,3), (Hbase,2))



  }
}
